package br.ufpb.di.ppgi.apresentacao.controllers;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.interceptor.download.Download;
import br.com.simtecnologia.access.controll.annotation.ControlledResource;
import br.com.simtecnologia.access.controll.role.Roles;
import br.ufpb.di.ppgi.apresentacao.SiteConfiguration;
import br.ufpb.di.ppgi.negocio.ServiceLocator;
import br.ufpb.di.ppgi.negocio.modelo.defesa.Defesa;
import br.ufpb.di.ppgi.negocio.modelo.defesa.DefesaStatus;
import br.ufpb.di.ppgi.negocio.modelo.proposta.Proposta;
import br.ufpb.di.ppgi.negocio.modelo.proposta.PropostaStatus;
import br.ufpb.di.ppgi.negocio.modelo.usuario.Usuario;
import br.ufpb.di.ppgi.util.PdfUtil;

@Path("/admin/relatorios/")
@ControlledResource
@Roles({"SECRETARIO"})
public class RelatoriosRestrictController extends AbstractController {
	
	private final ServiceLocator serviceLocator;
    private final PdfUtil pdfUtil;
	private final SiteConfiguration conf;
	
	private static final SimpleDateFormat sdf = new SimpleDateFormat("dd 'de' MMMM 'de' yyyy");
	
	public RelatoriosRestrictController(Result result, Validator validator,
			ServiceLocator services, PdfUtil pdfUtil, SiteConfiguration conf) {
		super(result, validator, services);

		this.conf = conf;
		this.serviceLocator = services;
		this.pdfUtil = pdfUtil;
	}
	
	@Path("propostas/")
	public void index() {
		result.include("pendenciasProposta", services.forProposta().listarByStatus(PropostaStatus.HOMOLOGADO));
		result.include("pendenciasDefesa",services.forDefesa().listarByStatus(DefesaStatus.HOMOLOGADA));
	}
	
	@Path("propostas/ata-proposta-{id}")
	public Download ataProposta(Long id) {
		Proposta proposta = serviceLocator.forProposta().buscar(id);
		return pdfUtil.makePdfFromJasperFile("ata_proposta.jasper", null, "ata_proposta"+id+".pdf", true, this.parametrosAtaProposta(proposta)); 
	}
	@Path("propostas/declaracao-proposta-{id}")
	public Download declaracaoProposta(Long id) {
		Proposta proposta = serviceLocator.forProposta().buscar(id);
		return pdfUtil.makePdfFromJasperFile("declaracao_proposta.jasper", null, "declaracao_proposta"+id+".pdf", true, this.parametrosDeclaracao(proposta)); 
	}
	@Path("propostas/ata-defesa-{id}")
	public Download ataDefesa(Long id) {
		Defesa defesa = serviceLocator.forDefesa().buscar(id);
		return pdfUtil.makePdfFromJasperFile("ata_defesa.jasper", null, "ata_defesa"+id+".pdf", true, this.parametrosAtaDefesa(defesa)); 
	}
	@Path("propostas/declaracao-defesa-{id}")
	public Download declaracaoDefesa(Long id) {
		Defesa defesa = serviceLocator.forDefesa().buscar(id);
		return pdfUtil.makePdfFromJasperFile("", null, "declaracao_defesa"+id+".pdf", true, this.parametrosDeclaracaoDefesa(defesa)); 
	}
	
	@SuppressWarnings("deprecation")
	private Map<String, Object> parametrosAtaProposta(Proposta proposta) {
		Map<String, Object> parametros = new HashMap<String, Object>();
		
		Date dataAtual = new Date();
		
		parametros.put("nome_mestrando",proposta.getAluno().getNome());
		parametros.put("data",sdf.format(proposta.getData_proposta()));
		parametros.put("dataAtual", sdf.format(dataAtual));
		parametros.put("nome_prof_orientador",proposta.getOrientador().getNome());
		parametros.put("nome_prof_examinador_1",proposta.getProfessor1().getNome());
		parametros.put("nome_prof_examinador_2",proposta.getProfessor2().getNome());
		parametros.put("titulo_dissertacao",proposta.getTitulo());
		parametros.put("cidade","João Pessoa");
		parametros.put("parecer",proposta.getStatus().getDescricao());
		return parametros;
	}
	
	private Map<String, Object> parametrosDeclaracao(Proposta proposta) {
		Map<String, Object> parametros = new HashMap<String, Object>();
		
		String textoPrincipal = proposta.textoAtaParticipacao();
		Usuario coordenador = services.forUsuario().fetchCoordenador();
		
		parametros.put("cabecalho1","UNIVERSIDADE FEDERAL DA PARAÃ�BA");
		parametros.put("cabecalho2", "CENTRO DE CIÃŠNCIAS EXATAS E DA NATUREZA");
		parametros.put("cabecalho3", "DEPARTAMENTO DE INFORMÃ�TICA");
		parametros.put("cabecalho4","PROGRAMA DE POS-GRADUAÃ‡ÃƒO EM INFORMÃ�TICA");
		parametros.put("titulo","DECLARAÃ‡ÃƒO");
		parametros.put("textoPrincipal",textoPrincipal);
		parametros.put("coordenadorPPGI",coordenador.getNome());
		parametros.put("imagem", conf.getContextDirPath()+"static/imagens/ppgi.gif");
		
		return parametros;
	}
	private Map<String, Object> parametrosAtaDefesa(Defesa defesa) {
		Map<String, Object> parametros = new HashMap<String, Object>();
		Usuario coordenador = services.forUsuario().fetchCoordenador();
		Date dataAtual = new Date();
		
		parametros.put("nome_mestrando",defesa.getAluno().getNome());
		parametros.put("data",sdf.format(defesa.getData_defesa()));
		parametros.put("dataAtual", sdf.format(dataAtual));
		parametros.put("hora",String.valueOf(defesa.getData_defesa().getHours()));
		parametros.put("local",defesa.getLocal());
		parametros.put("linha_de_pesquisa",defesa.getAluno().getLinha_pesquisa());
		parametros.put("nome_prof_orientador",defesa.getOrientador().getNome());
		parametros.put("nome_prof_examinador_1",defesa.getProfessor1().getNome());
		parametros.put("nome_prof_examinador_2",defesa.getProfessor2().getNome());
		parametros.put("nome_prof_examinador_ext","none");
		parametros.put("titulo_dissertacao",defesa.getTitulo());
		parametros.put("coordenador",coordenador.getNome());
		parametros.put("parecer",defesa.getStatus().getDescricao());
		parametros.put("area",defesa.getAluno().getArea());
		return parametros;
	}
	//TODO nao se sabe se o relatorio de declaração vai ser feito 
	private Map<String, Object> parametrosDeclaracaoDefesa(Defesa defesa){
		return null;
	}
}